/**
 * 请求配置
 */
export interface IConfig {
  // fetch 配置
  mode?: 'same-origin' | 'no-cors' | 'cors' | 'navigate'; // 请求的模式
  method?: 'get' | 'post' | 'put' | 'patch' | 'delete'; // 请求类型
  cache?: 'default' | 'no-store' | 'reload' | 'no-cache' | 'force-cache' | 'only-if-cached'; // 缓存模式
  credentials?: 'omit' | 'same-origin' | 'include'; // 是否应该在来源请求中发送来自其他域的cookie
  headers?: any; // 请求头
  body?: any; // 请求主体
  // 自定义配置
  dataFormat?: 'text' | 'json'; // 返回数据解析格式
  timeout?: number; // 请求超时
  label?: string; // 日志文本
  address?: string; // 请求地址
  data?: any; // 请求数据
  startTime?: number; // 开始请求时间
}

/**
 * 初始化配置
 */
export interface IRequestConfig {
  host: string; // API地址
  apiPath?: string; // API目录
  photoPath?: string; // 访问图片目录
  timeout?: number; // 超时时间
  defaultConfig?: IConfig; // 默认配置
  interceptorsRequest?: (config: IConfig) => IConfig; // 请求拦截器，可以返回拦截处理的配置
  interceptorsResponse?: (config: IConfig, res: any) => object; // 响应拦截器，可以返回拦截处理的结果
}

/**
 * 请求器
 * @param  {string}  url    请求地址
 * @param  {any}     data   请求数据
 * @param  {any}     config 请求配置
 * @return {Promise}        返回处理后的 Promise
 */
export type TRequest = (url: string, data?: any, config?: IConfig | string) => Promise<any>;
